package net.xdclass.service.stress.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import net.xdclass.dto.stress.StressCaseDTO;
import net.xdclass.dto.stress.StressCaseModuleDTO;
import net.xdclass.mapper.StressCaseMapper;
import net.xdclass.mapper.StressCaseModuleMapper;
import net.xdclass.model.StressCaseDO;
import net.xdclass.model.StressCaseModuleDO;
import net.xdclass.req.stress.StressCaseModuleSaveReq;
import net.xdclass.req.stress.StressCaseModuleUpdateReq;
import net.xdclass.service.stress.StressCaseModuleService;
import net.xdclass.util.SpringBeanUtil;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class StressCaseModuleServiceImpl implements StressCaseModuleService {
    @Resource
    private StressCaseModuleMapper stressCaseModuleMapper;
    @Resource
    private StressCaseMapper stressCaseMapper;
    /**
     * 根据项目ID查询压力测试模块列表。
     *
     * @param projectId 项目ID，用于筛选属于指定项目的压力测试模块。
     * @return 返回压力测试模块的DTO列表，每个模块包含其下的压力测试用例列表。
     */
    @Override
    public List<StressCaseModuleDTO> list(Long projectId) {
        // 创建查询条件，指定查询项目ID为指定值的压力测试模块
        LambdaQueryWrapper<StressCaseModuleDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StressCaseModuleDO::getProjectId, projectId);

        // 根据查询条件查询符合条件的压力测试模块数据
        List<StressCaseModuleDO> stressCaseModuleDOS = stressCaseModuleMapper.selectList(queryWrapper);

        // 将查询到的压力测试模块DO对象列表转换为DTO对象列表
        List<StressCaseModuleDTO> stressCaseModuleDTOS = SpringBeanUtil.copyProperties(stressCaseModuleDOS, StressCaseModuleDTO.class);

        // 遍历每个模块，查询并设置其下的压力测试用例列表
        stressCaseModuleDTOS.forEach(stressCaseModuleDTO -> {
            // 创建查询条件，指定查询模块ID为当前模块ID的压力测试用例
            // 查询压测模块下的压测用例
            LambdaQueryWrapper<StressCaseDO> caseQueryWrapper = new LambdaQueryWrapper<>();
            caseQueryWrapper.eq(StressCaseDO::getModuleId, stressCaseModuleDTO.getId()).orderByDesc(StressCaseDO::getId);

            // 根据查询条件查询符合条件的压力测试用例数据
            List<StressCaseDO> stressCaseDOS = stressCaseMapper.selectList(caseQueryWrapper);

            // 将查询到的压力测试用例DO对象列表转换为DTO对象列表
            List<StressCaseDTO> stressCaseDTOS = SpringBeanUtil.copyProperties(stressCaseDOS, StressCaseDTO.class);

            // 将压力测试用例列表设置到当前模块的DTO对象中
            stressCaseModuleDTO.setList(stressCaseDTOS);
        });

        // 返回处理后的压力测试模块DTO列表
        return stressCaseModuleDTOS;
    }

    /**
     * 根据项目ID和模块ID查找压力测试模块及其案例。
     *
     * @param projectId 项目ID。
     * @param moduleId 模块ID。
     * @return 压力测试模块的DTO对象，包含模块信息和关联的测试案例。
     */
    @Override
    public StressCaseModuleDTO findById(Long projectId, Long moduleId) {
        // 创建查询条件，指定项目ID和模块ID进行查询
        LambdaQueryWrapper<StressCaseModuleDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StressCaseModuleDO::getProjectId, projectId).eq(StressCaseModuleDO::getId, moduleId);
        // 根据查询条件查询模块信息
        StressCaseModuleDO stressCaseModuleDO = stressCaseModuleMapper.selectOne(queryWrapper);
        // 如果模块信息不存在，则返回null
        if(stressCaseModuleDO == null)
            return null;
        // 将查询到的模块信息转换为DTO对象
        StressCaseModuleDTO stressCaseModuleDTO = SpringBeanUtil.copyProperties(stressCaseModuleDO, StressCaseModuleDTO.class);

        // 创建查询条件，指定模块ID并按案例ID降序查询测试案例
        LambdaQueryWrapper<StressCaseDO> caseQueryWrapper = new LambdaQueryWrapper<>();
        caseQueryWrapper.eq(StressCaseDO::getModuleId, moduleId).orderByDesc(StressCaseDO::getId);
        // 根据查询条件查询所有关联的测试案例
        List<StressCaseDO> stressCaseDOS = stressCaseMapper.selectList(caseQueryWrapper);
        // 将查询到的测试案例转换为DTO对象列表
        List<StressCaseDTO> stressCaseDTOS = SpringBeanUtil.copyProperties(stressCaseDOS, StressCaseDTO.class);
        // 将测试案例列表设置到模块DTO对象中
        stressCaseModuleDTO.setList(stressCaseDTOS);
        // 返回包含模块信息和测试案例的DTO对象
        return stressCaseModuleDTO;
    }

    @Override
    public int delete(Long id, Long projectId) {
        LambdaQueryWrapper<StressCaseModuleDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StressCaseModuleDO::getId, id).eq(StressCaseModuleDO::getProjectId, projectId);
        int delete = stressCaseModuleMapper.delete(queryWrapper);
        //删除模块下的所有关联用例
        if(delete > 0)
        {
            LambdaQueryWrapper<StressCaseDO> caseQueryWrapper = new LambdaQueryWrapper<>();
            caseQueryWrapper.eq(StressCaseDO::getModuleId, id);
            stressCaseMapper.delete(caseQueryWrapper);
        }
        return delete;
    }

    @Override
    public int save(StressCaseModuleSaveReq req) {
        StressCaseModuleDO stressCaseModuleDO = SpringBeanUtil.copyProperties(req, StressCaseModuleDO.class);
        return stressCaseModuleMapper.insert(stressCaseModuleDO);
    }

    @Override
    public int update(StressCaseModuleUpdateReq req) {
        StressCaseModuleDO stressCaseModuleDO = SpringBeanUtil.copyProperties(req, StressCaseModuleDO.class);
        LambdaQueryWrapper<StressCaseModuleDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StressCaseModuleDO::getId, req.getId()).eq(StressCaseModuleDO::getProjectId, req.getProjectId());
        return stressCaseModuleMapper.update(stressCaseModuleDO, queryWrapper);
    }


}
